package com.example.java_chatroom.controller;


import com.example.java_chatroom.model.*;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpSession;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@RestController
@RequestMapping("/session")
public class SessionController {
    @Resource
    private MessageSessionMapper messageSessionMapper;

    @Resource
    private MessageMapper messageMapper;

    @GetMapping("/sessionList")
    public List<MessageSession> getSessionList(HttpServletRequest req) {
        //返回的是一个MessageSession数组
        List<MessageSession> messageSessionList = new ArrayList<>();
        //1.获取用户Id
        HttpSession session = req.getSession(false);
        if (session == null) {
            System.out.println("[getSessionList]:获取session失败");
            return new ArrayList<>();
        }

        User user = (User)session.getAttribute("user");
        if (user == null) {
            System.out.println("[getSessionList]:获取user失败");
            return new ArrayList<>();
        }

        //2.根据用户Id找到当前用户存在在哪些会话中（sessionId）
        List<Integer> sessionIds = messageSessionMapper.getSessionIdsByuserId(user.getUserId());

        //3.根据sessionId找到除了当前用户的所有的用户,并把这些信息构造到MessageSession类
        for (int sessionId : sessionIds) {
            MessageSession messageSession = new MessageSession();

            //获取当前会话中的用户（除了自己）
            List<Friend> friends = messageSessionMapper.getFriendsBySessionId(sessionId, user.getUserId());

            messageSession.setSessionId(sessionId);
            messageSession.setFriends(friends);

            //通过sessionId获取到当前会话中的最后一条消息
            String lastMessage = messageMapper.getLastMessageBySessionId(sessionId);
            //判断消息是否为空(可能两个用户还没有发过消息)
            if (lastMessage == null) {
                messageSession.setLastMessage("");
            } else {
                messageSession.setLastMessage(lastMessage);
            }

            messageSessionList.add(messageSession);
        }
        //4.传给前端
        return messageSessionList;
    }

    /**
     * 点击好友后会创建一个会话
     * @param toUserId
     * @param user
     * @return
     */
    @PostMapping("/addSession")
    @Transactional
    public Object addSession(int toUserId, @SessionAttribute("user") User user) {
        //@SessionAttribute是spring注解，它可以直接获取到session中存储的数据比较方便，如果获取失败会报错
        // 如果想要处理获取失败后的情况则需使用HttpSessionRequestServlet类

        //构造响应格式
        //由于接口文档中要求响应的格式是json，所以此处随便用了一个hashMap对象
        Map<String, Integer> resp = new HashMap<>();

        // 1.插入message_session表后，获取自增的sessionId
        //当前这个messageSession对象是空的
        MessageSession messageSession = new MessageSession();
        //此时这个当前这个messageSession对象的sessionId属性被赋值
        messageSessionMapper.addMessageSession(messageSession);

        // 2.在 message_session_user 表中插入两条记录
        MessageSessionUserItem item1 = new MessageSessionUserItem();
        item1.setSessionId(messageSession.getSessionId());
        //当前用户Id
        item1.setUserId(user.getUserId());
        messageSessionMapper.addMessageSessionUser(item1);

        MessageSessionUserItem item2 = new MessageSessionUserItem();
        item2.setSessionId(messageSession.getSessionId());
        //这个会话中的另一个用户Id
        item2.setUserId(toUserId);
        messageSessionMapper.addMessageSessionUser(item2);

        //返回响应
        System.out.println("新增会话成功！ [addSession] ， sessionId" + messageSession.getSessionId()+
                " userId:"+user.getUserId()+" toUserId:"+toUserId);
        resp.put("sessionId", messageSession.getSessionId());
        return resp;
    }

    /**
     * 根据sessionId删除数据库中的会话记录
     * @param sessionId
     * @return
     */
    @PostMapping("/delSessionBySessionId")
    @Transactional
    public int delSessionBySessionId(int sessionId) {
        int ret = 0;
        // 先删除message_session表中的记录
        ret += messageSessionMapper.deleteSessionBySessionId(sessionId);

        // 再删除message_session_user表中的记录
        ret += messageSessionMapper.deleteSessionUserBySessionId(sessionId);

        // 再删除message表中的消息记录
        ret += messageSessionMapper.deleteSessionMessageBySessionId(sessionId);
        System.out.println("删除会话成功，影响数据库行数："+ret);
        return ret;
    }

    @GetMapping("/getFriendBySessionId")
    public Object getFriendBySessionId(int sessionId, HttpServletRequest req) {
        //1.获取用户Id
        HttpSession session = req.getSession(false);
        if (session == null) {
            System.out.println("[getFriendBySessionId]:获取session失败");
            return null;
        }
        User user = (User)session.getAttribute("user");
        if (user == null) {
            System.out.println("[getFriendBySessionId]:获取user失败");
            return null;
        }

        // 在单聊的情况下只有一个用户
        List<Friend> friends = messageSessionMapper.getFriendsBySessionId(sessionId, user.getUserId());
        System.out.println("[getFriendBySessionId] 该会话中的用户:");
        for (Friend friend : friends) {
            System.out.println(friend);
        }

        // 返回这个会话中的另一个用户
        return friends.get(0);
    }
}
